#ifndef TASKMANAGERAPP_H
#define TASKMANAGERAPP_H

#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QJsonObject>
#include <QJsonArray>
#include <QMap>
#include <optional> // C++17 可选的 selected_task_id

// 前置声明以减少头文件依赖
QT_BEGIN_NAMESPACE
class QListWidget;
class QListWidgetItem;
class QLineEdit;
class QComboBox;
class QLabel;
class QPushButton;
class QDateTime;
class QStatusBar;
QT_END_NAMESPACE

class TaskManagerApp : public QMainWindow
{
    Q_OBJECT // 宏，用于定义信号或槽的类

public:
    explicit TaskManagerApp(QWidget *parent = nullptr);
    ~TaskManagerApp();

private slots:
    // --- UI 交互槽 ---
    void onTaskSelectionChanged();
    void prepareNewTask();
    void saveTask();
    void deleteTask();
    void loadTasks(); // 从 refresh_button 点击重命名，为了清晰起见

    // --- 网络回复槽 ---
    void handleTasksFetched(QNetworkReply *reply);
    void handleTaskDetailsFetched(QNetworkReply *reply);
    void handleTaskCreated(QNetworkReply *reply);
    void handleTaskUpdated(QNetworkReply *reply);
    void handleTaskDeleted(QNetworkReply *reply);
    void handleNetworkError(QNetworkReply *reply); // 通用错误处理程序

private:
    // --- UI 元素 ---
    QListWidget *taskListWidget;
    QLabel *idLabelValue; // 用于显示 ID 值的标签
    QLineEdit *titleLineEdit;
    QLineEdit *descLineEdit;
    QComboBox *statusComboBox;
    QLineEdit *dueDateLineEdit;
    QLabel *createdLabelValue;
    QLabel *updatedLabelValue;
    QPushButton *refreshButton;
    QPushButton *newButton;
    QPushButton *saveButton;
    QPushButton *deleteButton;
    QStatusBar *mainStatusBar; // 使用 QMainWindow 的状态栏

    // --- 数据成员 ---
    QNetworkAccessManager *networkManager;
    QMap<int, QJsonObject> tasksData; // 任务详情缓存 (ID -> 任务 JSON)
    std::optional<int> selectedTaskId; // 当前选中的任务 ID
    const QString apiBaseUrl = "http://localhost:8080/api/v1";
    // Qt ISO 格式通常包含时区偏移或 'Z'
    const QString dateTimeFormatApi = "yyyy-MM-ddTHH:mm:ss.zzzZ"; // API 期望的格式
    const QString dateTimeFormatDisplay = "yyyy-MM-dd HH:mm:ss"; // 用于显示的格式


    // --- 辅助函数 ---
    void setupUi();
    void setupConnections();
    void clearForm(bool clearId = true);
    void populateForm(const QJsonObject &task);
    void updateTaskList(const QJsonArray &tasks);
    void updateTaskItemInList(const QJsonObject &task);
    void removeTaskItemFromList(int taskId);
    void setFormEnabled(bool enabled);
    void showStatus(const QString &message, int timeout = 0); // timeout 0 = 永久
    void showError(const QString &title, const QString &message);
    QString formatDateTime(const QString &dateTimeString);
    QJsonObject getFormData();
    void selectTaskInList(int taskId);
    void handleGenericReply(QNetworkReply *reply, const std::function<void(const QByteArray&)>& successCallback, const QString& errorContext);
};

#endif // TASKMANAGERAPP_H
